package org.github.choviwu.example.common.util;

import com.jcraft.jsch.*;
import org.apache.commons.lang.time.DateFormatUtils;

import java.io.*;
import java.util.Date;
import java.util.Properties;
import java.util.Vector;

/**
 * @author YangHua
 * 转载请注明出处：http://www.xfok.net/2009/10/124485.html
 */
public class SFTPUtils {

    /**
     * 连接sftp服务器
     * @param host 主机
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public ChannelSftp connect(String host, int port, String username,
                               String password) {
        ChannelSftp sftp = null;
        try {
            JSch jsch = new JSch();
            jsch.getSession(username, host, port);
            Session sshSession = jsch.getSession(username, host, port);
            System.out.println("Session created.");
            sshSession.setPassword(password);
            Properties sshConfig = new Properties();
            sshConfig.put("StrictHostKeyChecking", "no");
            sshSession.setConfig(sshConfig);
            sshSession.connect();
            System.out.println("Session connected.");
            System.out.println("Opening Channel.");
            Channel channel = sshSession.openChannel("sftp");
            channel.connect();
            sftp = (ChannelSftp) channel;
            System.out.println("Connected to " + host + ".");
        } catch (Exception e) {

        }
        return sftp;
    }

    /**
     * 上传文件
     * @param directory 上传的目录
     * @param uploadFile 要上传的文件
     * @param sftp
     */
    public void upload(String directory, String uploadFile, ChannelSftp sftp) {
        FileInputStream fileInputStream = null;
        try {
                sftp.cd(directory);
            File file=new File(uploadFile);
            fileInputStream = new FileInputStream(file);
            sftp.put(fileInputStream, file.getName());
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            sftp.disconnect();
            if(fileInputStream!=null){
                try {
                    fileInputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 直接用流上传
     * @param directory
     * @param uploadFile
     * @param filename
     * @param sftp
     */
    public void upload(String directory, FileInputStream uploadFile,String filename, ChannelSftp sftp){
        try {
            sftp.cd(directory);
            sftp.put(uploadFile, filename);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            sftp.disconnect();
            if(uploadFile!=null){
                try {
                    uploadFile.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 下载文件
     * @param directory 下载目录
     * @param downloadFile 下载的文件
     * @param saveFile 存在本地的路径
     * @param sftp
     */
    public void download(String directory, String downloadFile,String saveFile, ChannelSftp sftp) {
        FileOutputStream fileOutputStream = null;
        try {
            sftp.cd(directory);
            File file=new File(saveFile);
            fileOutputStream = new FileOutputStream(file);
            sftp.get(downloadFile, fileOutputStream);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            sftp.disconnect();
            if(fileOutputStream!=null){
                try {
                    fileOutputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 删除文件
     * @param directory 要删除文件所在目录
     * @param deleteFile 要删除的文件
     * @param sftp
     */
    public void delete(String directory, String deleteFile, ChannelSftp sftp) {
        try {
            sftp.cd(directory);
            sftp.rm(deleteFile);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            sftp.disconnect();
        }
    }

    /**
     * 列出目录下的文件
     * @param directory 要列出的目录
     * @param sftp
     * @return
     * @throws SftpException
     */
    public Vector listFiles(String directory, ChannelSftp sftp) throws SftpException{
        return sftp.ls(directory);
    }

    public static void main(String[] args) {

        SFTPUtils sf = new SFTPUtils();

        String host = "118.89.51.48";
        int port = 22;
        String username = "root";
        String password = "choviWu0.0";


        String directory = "/";
        String uploadFile = "D:\\images\\1.jpg";
        //String downloadFile = "330482199303022439_bg.jpg";
        String saveFile = "D:\\tmp\\cjbfg.jpg";
        //String deleteFile = "delete.txt";
        ChannelSftp sftp=sf.connect(host, port, username, password);
       // sf.upload(directory, uploadFile, sftp);
     // sf.download(directory, downloadFile, saveFile, sftp);
      //sf.delete(directory, downloadFile, sftp);
      //  try{
      //      sftp.cd(directory);
      //      sftp.mkdir("ss");
      //      System.out.println("finished");
      //  }catch(Exception e){
      //      e.printStackTrace();
      //  }
        FileInputStream inputStream = null;

        try {
            inputStream = new FileInputStream(new File(uploadFile));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }

        String dateString = DateFormatUtils.format(new Date(),"yyyyMMdd");

        sf.upload("/root/",uploadFile,sftp);
        //sf.upload("/",inputStream,"sinvestchk20170731.dat",sftp);
        if(uploadFile != null){
            try {
                inputStream.close();
                sftp.disconnect();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
//        sf.upload("/",inputStream,"srepaycle"+dateString+".dat",sftp);
//        sftp.disconnect();
    }


}